home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / make.arc / MAKE.DOC next >
Text File  |  1986-02-19  |  26KB  |  859 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.                                NDMAKE version 3.0
  9.                                ------------------
  10.                      Copyright (C) 1985, 1986 D. G. Kneller
  11.                               All rights reserved.
  12.  
  13.  
  14.      Program Description
  15.      -------------------
  16.  
  17.      NDMAKE is an implementation of the UN*X program maintenance utility
  18.      called `make'.  It has the same syntax and most of the capability.  If
  19.      you are familiar with UN*X `make' you should have no difficulties with
  20.      NDMAKE.  In the rest of this documentation, NDMAKE will be referred to
  21.      simply as `MAKE'.
  22.      
  23.      MAKE is a utility that helps you maintain programs, particularly
  24.      programs that are composed of several modules (files).  Once you
  25.      describe the relationships between these modules, MAKE will keep track
  26.      of the modules and only `make' those that are out of date with respect
  27.      to their sources.  MAKE can also be used as a general compile and link
  28.      tool for handling single files, much like a batch file.
  29.      
  30.      MAKE requires at least DOS 2.0 and uses a minimum of about 30000 bytes
  31.      of memory.  Since MAKE executes other programs from within itself,
  32.      this memory will be unavailable to them while MAKE is running.  Also,
  33.      since MAKE uses the file time to determine which files are newer, it
  34.      is imperative that you either have a real-time clock or are diligent
  35.      about setting the time and date when you boot up.
  36.      
  37.  
  38.      Synopsis
  39.      --------
  40.  
  41.           make [-f makefile] [options] [macros] [targets]
  42.      
  43.      The [] signify optional parameters.  [options] and [macros] will be
  44.      discussed later.
  45.      
  46.  
  47.      Description
  48.      -----------
  49.  
  50.      MAKE executes commands in a MAKE description file to update one or
  51.      more targets.  The targets are typically the names of programs.  If no
  52.      -f option is present, the MAKE description file called `makefile' is
  53.      tried.   If makefile is `-', the keyboard (standard input) is used as
  54.      the makefile.  More than one -f option may appear.
  55.      
  56.      Make updates a target if it is older than the files it depends on, or
  57.      if the target does not exist.  If no targets are given on the command
  58.      line, the first target in the makefile is `made'.
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.                                                     NDMAKE v3.0 page 2
  68.  
  69.  
  70.  
  71.  
  72.  
  73.      The MAKE description files
  74.      --------------------------
  75.  
  76.      MAKE uses 2 description files: `makefile' and `make.ini'.  The
  77.      description files consists of several kinds of entries:
  78.      
  79.           1) dependency and command lines
  80.           2) macro definitions
  81.           3) default rules
  82.           4) "dot commands"
  83.      
  84.      When MAKE starts up, it looks for an initialization file called
  85.      `make.ini'.  This file usually contains only default rules and macro
  86.      definitions that you don't want to put in every makefile.  The current
  87.      directory is searched first, followed by directories along the PATH.
  88.      You customize your copy of MAKE by changing `make.ini'.
  89.      
  90.  
  91.      1) Dependency and command lines
  92.      -------------------------------
  93.  
  94.      These are lines that specify the relationship between targets and
  95.      dependents, and how to update the targets.  The general form is:
  96.      
  97.      targets : [dependents]
  98.      [<tab>command]
  99.         ....
  100.      
  101.      where <tab> is the tab character.
  102.      
  103.      The first line of an entry is a blank-separated list of targets, then
  104.      a colon, then a list of prerequisite files.  All following lines that
  105.      begin with a tab are commands to be executed to update the target.
  106.      For example, assume you have a program `test.exe' that is composed of
  107.      modules `main.obj' and `sub.obj'.  Each of these depend on a common
  108.      include file, `incl.h', and on their respective `.c' files.  The
  109.      makefile might look like:
  110.      
  111.      test.exe : main.obj sub.obj
  112.           link main.obj sub.obj, test;
  113.      
  114.      main.obj : main.c incl.h
  115.           msc -AL main.c;
  116.      
  117.      sub.obj : sub.c incl.h
  118.           msc -AL sub.c;
  119.      
  120.      If a target appears on the left of more than one `colon' line, then it
  121.      depends on all of the names on the right of the colon on those lines,
  122.      but only one command sequence may be specified for it.  The previous
  123.      example could have been written as:
  124.      
  125.      test.exe : main.obj sub.obj
  126.           link main.obj sub.obj, test;
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.                                                     NDMAKE v3.0 page 3
  134.  
  135.  
  136.  
  137.  
  138.  
  139.      
  140.      main.obj : main.c
  141.           msc -AL main.c;
  142.      
  143.      sub.obj : sub.c
  144.           msc -AL sub.c;
  145.      
  146.      main.obj sub.obj : incl.h
  147.      
  148.      A target that has no dependents is considered always out of date and
  149.      is always made.  On the command line, wildcard characters can be given
  150.      in target names provided there are files to match the wildcards.
  151.      
  152.  
  153.      2) Macro definitions
  154.      --------------------
  155.  
  156.      Makefile entries of the form:
  157.      
  158.      name = [value]
  159.      
  160.      are macro definitions.  Macros allow the association of a name and a
  161.      value.  Subsequent appearances of $(name) or ${name} are replaced by
  162.      value.  If name is a single character, the parentheses or braces are
  163.      optional.  Spaces between name and =, and between = and value are
  164.      ignored.  If value is not given, the macro value is a null string.
  165.      
  166.      The previous example could have had:
  167.      
  168.      OBJS = main.obj sub.obj
  169.      
  170.      test.exe : $(OBJS)
  171.           link $(OBJS), test;
  172.      
  173.      main.obj : main.c
  174.           msc -AL main.c;
  175.      
  176.      sub.obj : sub.c
  177.           msc -AL sub.c;
  178.      
  179.      $(OBJS) : incl.h
  180.      
  181.      Macros can be entered as command line parameters.  For example:
  182.      
  183.      A> make CFLAGS=-AL test.exe
  184.      
  185.      MAKE evaluates macros only when needed, and the order in which macros
  186.      appear in a description file is insignificant.  Conventionally, all
  187.      definitions appear at the top of the description file.  If the same
  188.      name is defined more than once, the most recent definition is used.
  189.      The precedence of definitions is:
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.                                                     NDMAKE v3.0 page 4
  200.  
  201.  
  202.  
  203.  
  204.  
  205.      
  206.           1. command line definition    (highest)
  207.           2. `makefile' definition
  208.           3. `make.ini' definition
  209.           4. environment definition     (lowest)
  210.      
  211.      
  212.      Predefined macros:
  213.      
  214.      There are 4 "run-time" macros.  These are:
  215.      
  216.           $* - stands for the target name with suffix deleted
  217.           $@ - stands for the full target name
  218.           $< - stands for the complete list of prerequisites
  219.           $? - stands for the list of prerequisites that are out
  220.                of date with respect to the target.
  221.      
  222.      These are usually used when defining default rules (to be discussed
  223.      next).  Unlike UN*X make, you can use these run-time macros anywhere
  224.      they make sense.  Thus, a dependency line for OBJS could be:
  225.      
  226.           $(OBJS) : $*.c
  227.      
  228.      The macro `MFLAGS' gets filled in with the initial command line
  229.      options supplied to MAKE.  This can be used to invoke MAKE on
  230.      makefiles in subdirectories and pass along the options.  The macro
  231.      `CWD' gets filled in with the current directory.
  232.      
  233.      The macro `$$' evaluates to the dollar sign `$'.
  234.      
  235.  
  236.      3) Default rules
  237.      ----------------
  238.  
  239.      MAKE can use default rules to specify commands for files for which the
  240.      makefile gives no explicit commands.  A default rule tells MAKE how to
  241.      create a file with a particular extension from a file with the same
  242.      base name but another extension.  Default rules take the following
  243.      form:
  244.      
  245.      .from_extension.to_extension :
  246.           command
  247.           [command]
  248.            ...
  249.      
  250.      For example, to produce a `.obj' file from a `.c' file, the default
  251.      rule could be:
  252.      
  253.      .c.obj :
  254.           msc -AL $*.c;
  255.      
  256.      When MAKE finds a dependency with no commands, it looks for the first
  257.      possible name for which both a rule and a file exist.  Since there may
  258.      be several ways to produce a `.obj' file (eg from a C, FORTRAN, or
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.                                                     NDMAKE v3.0 page 5
  266.  
  267.  
  268.  
  269.  
  270.  
  271.      PASCAL compiler, or from MASM), the order in which rules are attempted
  272.      is specified by the `.SUFFIXES' list.  This is a special target with a
  273.      list of extensions.  For example:
  274.      
  275.      .SUFFIXES: .exe .obj .c .asm .for
  276.      
  277.      If MAKE was trying to make a `test.obj' file using a default rule, it
  278.      would first look for a `.c.obj' rule.  If it found a `.c.obj' rule, it
  279.      would check if the file `test.c' existed.  If it didn't, MAKE would
  280.      look for a `.asm.obj' rule (and `test.asm' file), and finally a
  281.      `.for.obj' rule (and `test.for' file).
  282.      
  283.      Assuming `make.ini' contained the .c.obj rule and the .SUFFIXES as
  284.      defined above, our previous example could be written more succinctly:
  285.      
  286.      OBJS = main.obj sub.obj
  287.      
  288.      test.exe : $(OBJS)
  289.           link $(OBJS), test;
  290.  
  291.      $(OBJS) : incl.h
  292.  
  293.      Because of the default rules, `main.obj' and `sub.obj' implicitly
  294.      depend on files `main.c' and `sub.c', respectively,  as well as
  295.      explicitly depending on `incl.h'.
  296.      
  297.      Suffixes accumulate, so if the makefile had the line:
  298.      
  299.      .SUFFIXES : .obj .pas
  300.      
  301.      the suffix list would look like:  .obj .pas .exe .obj .c .asm .for
  302.      A .SUFFIXES line with nothing on it clears the list of suffixes.
  303.      
  304.  
  305.      4) "dot commands"
  306.      -----------------
  307.  
  308.      Besides the special target `.SUFFIXES' mentioned above, there are a
  309.      few other special targets and dependents that can be put in MAKE
  310.      description files.
  311.      
  312.      .HELP - prints a reminder that `make -h' gives help.
  313.      
  314.      .IGNORE - Commands returning nonzero status (ie. the exit code or
  315.      errorlevel) cause MAKE to terminate unless the special target
  316.      `.IGNORE' is in makefile or the command begins with `-' (hyphen).
  317.      
  318.      .SILENT - Commands to be executed are printed when executed unless the
  319.      special target `.SILENT' is in makefile, or the first character of the
  320.      command is `@'.  For example:
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.                                                     NDMAKE v3.0 page 6
  332.  
  333.  
  334.  
  335.  
  336.  
  337.      
  338.      all.exe : 1.obj 2.obj 3.obj
  339.           link 1 2 3, tmp.exe;          # this line will be printed
  340.           - exepack tmp.exe all.exe     # ignore any errors
  341.           @erase tmp.exe                # this line will not be printed
  342.      
  343.      .PRECIOUS - Break (control-C) and command errors cause the target to
  344.      be deleted unless the target has no dependents (explicit or implicit),
  345.      or depends on the special name `.PRECIOUS'.  For example:
  346.      
  347.      nerase.exe : nerase.obj .PRECIOUS  # nerase.exe won't be deleted if
  348.           link nerase;                  # link returns an error.
  349.      
  350.      
  351.      Additional notes and technical information
  352.      ------------------------------------------
  353.      
  354.      If you type in a `makefile' from the keyboard (by using the command
  355.      `make -f -'), to signal you are done put a ^Z (control-Z) followed by
  356.      a <RETURN> as the last two characters.
  357.      
  358.      Lines in a MAKE description file that are too long to fit on one line
  359.      can be extended to the next line by putting a backslash, `\', as the
  360.      last character of the line.
  361.      
  362.      Everything on a line after the comment character, `#', is ignored.
  363.      Blank lines and lines that start with `#' are completely ignored.
  364.      
  365.      Case is not important, so `test.obj' and `TEST.OBJ' are the same.
  366.      
  367.      The separation character between targets and dependents, `:' is also
  368.      the character used for the drive separator in MSDOS.  For MAKE to know
  369.      this colon is *not* the drive separator, it must be followed by a
  370.      space, semicolon or colon (see below), or nothing.
  371.      
  372.      MAKE is stupid in that after the commands to update a target have been
  373.      executed without error, MAKE assumes the target is up to date.  If you
  374.      give commands that don't really update a target, MAKE doesn't know.
  375.      
  376.      When MAKE executes commands, such as `link', it first tries to find a
  377.      file called `link.exe' (or `link.com').  If the file is not found,
  378.      MAKE loads a second copy of COMMAND.COM and passes it the command
  379.      line, in the hope that the command is an internal DOS command.  This
  380.      is backwards to how COMMAND.COM normally works (first checking
  381.      internally, then checking externally).  It is done this way because I
  382.      could not get the second copy of COMMAND.COM to return the exit code
  383.      of the passed command.  I'm using Microsoft C v3.0 and PCDOS 2.0, so
  384.      if anyone knows how to get the exit code back, please let me know.
  385.      
  386.      You can force MAKE to load a second copy of COMMAND.COM by putting a
  387.      `+' as the first letter in the command.  You can put more than one of
  388.      `-', `@', and `+' for each command.  Ex:
  389.      
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.                                                     NDMAKE v3.0 page 7
  398.  
  399.  
  400.  
  401.  
  402.  
  403.           @- exepack tmp.exe all.exe
  404.      
  405.      MAKE always uses a second copy of COMMAND.COM if the command involves
  406.      redirection of IO (with `>', `>>', `<', or `|').
  407.      
  408.      Most commands must be shorter than the DOS command line limit of 128
  409.      characters.  Since `link' is used so often, MAKE knows about it
  410.      specially and will automatically use a response file if the `link'
  411.      command is longer than the limit.
  412.      
  413.      Macro definitions can refer to other macros.  You could have:
  414.      
  415.      CFLAGS = -A$(MODEL) -Od       # remember, order is not important
  416.      MODEL = L
  417.      
  418.      When it comes time to use CFLAGS, MAKE will expand CFLAGS as
  419.      `-AL -Od'.  Command line macros have the highest precedence, so:
  420.      
  421.      A> make MODEL=S test.exe
  422.      
  423.      results in CFLAGS having the value `-AS -Od'.  For command line macros
  424.      that contain spaces, enclose entirely the macro in double quotes, " ":
  425.      
  426.      A> make "CFLAGS=-A$(MODEL) -Zd" MODEL=M test.exe
  427.      
  428.      MAKE will let you define a recursive macro:
  429.      
  430.      macro1 = $(macro2)       # macro1 = the value of macro2
  431.      macro2 = $(macro1)       # macro2 = the value of macro1
  432.      
  433.      but generate an error if it tries to use it.
  434.      
  435.      
  436.      UN*X features
  437.      -------------
  438.      
  439.      As with UN*X, dependency lines and default rules can have a command on
  440.      the same line as the `colon' line, if the command follows a semicolon:
  441.      
  442.      .c.obj:; msc $*.c;
  443.      test.exe: $(OBJS); link $(OBJS), test;
  444.           @echo done
  445.      
  446.      # are equivalent to
  447.      
  448.      .c.obj:
  449.           msc $*.c;
  450.      test.exe: $(OBJS)
  451.           link $(OBJS), test;
  452.           @echo done
  453.      
  454.      If a name appears on a line with a double colon :: then the command
  455.      sequence following that line is performed only if the name is out of
  456.      date with respect to the names to the right of the double colon, and
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.                                                     NDMAKE v3.0 page 8
  464.  
  465.  
  466.  
  467.  
  468.  
  469.      is not affected by other double colon lines on which that name may
  470.      appear.  Consider the following makefile:
  471.      
  472.      1:: 2
  473.           @echo 2
  474.      1:: 3
  475.           @echo 3
  476.      
  477.      If 2 and 3 are more recent than 1 and you type:
  478.      
  479.      A> make 1
  480.      
  481.      The response will be:
  482.      2
  483.      3
  484.      
  485.      If 1 is more recent than 3, but 2 is newer than 1 the response is:
  486.      2
  487.      
  488.      If 1 is more recent than both 2 and 3, the response will be:
  489.      Make: `1' is up to date.
  490.      
  491.  
  492.      OPTIONS
  493.      -------
  494.  
  495.      Options are entered on the command line with a `-' preceding them.
  496.      You cannot use `/' instead of `-'.  -nd is equivalent to -n -d.
  497.      
  498.           -d   Debug mode.  Prints information on macros, dependencies,
  499.                SUFFIXES, default rules.  Also traces MAKE as it excutes.
  500.      
  501.           -h   Print a help screen.  Also, -? will do the same.
  502.      
  503.           -i   Equivalent to the special entry `.IGNORE'.  Causes commands
  504.                that return errors to be ignored.  Doing `make -i > errs'
  505.                collects all error messages into 1 `errs' file.  To stop
  506.                running `make -i' you may have to push ^C several times.
  507.      
  508.           -k   When a command returns nonzero status, abandon work on the
  509.                current target, but continue on branches that do not depend
  510.                on the current target.
  511.      
  512.           -n   Display but do not execute the commands needed to update the
  513.                targets.  Doing `make -n > todo.bat' produces the batch file
  514.                `todo.bat' containing the commands to be executed.
  515.      
  516.           -r   Clears the .SUFFIXES list after `make.ini' is read.
  517.      
  518.           -s   Equivalent to the special entry `.SILENT'.  Commands are not
  519.                echoed to the screen before they are executed.
  520.      
  521.           -t   Touch, i.e. set the file time of the out of date targets to
  522.                the current time without executing any commands.
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.                                                     NDMAKE v3.0 page 9
  530.  
  531.  
  532.  
  533.  
  534.  
  535.      Sample session
  536.      --------------
  537.  
  538.      A sample `make.ini' file
  539.      ------------------------
  540.      .SUFFIXES : .exe .obj .c .for .asm
  541.      
  542.      M = S
  543.      CFLAGS = -A$M
  544.      
  545.      .c.obj:; cl $(CFLAGS) -c $*.c
  546.      
  547.      .obj.exe:; link $*.obj, $@;
  548.      
  549.      .c.exe:
  550.           cl $(CFLAGS) -c $*.c
  551.           link $*.obj, $@;
  552.           erase $*.obj
  553.      
  554.      A sample makefile
  555.      -----------------
  556.      OBJS = main.obj sub.obj
  557.      
  558.      test.exe: $(OBJS)
  559.           link $<, $@;
  560.      
  561.      $(OBJS): incl.h
  562.      
  563.      sub.obj: sub.c
  564.           cl $(CFLAGS) -Od -c sub.c
  565.      
  566.      install: test.exe
  567.           copy test.exe $(BIN)          # BIN comes from the environment
  568.  
  569.      ----------
  570.  
  571.      Assume the following files are in your directory: `main.c', `sub.c',
  572.      `incl.h'.  When you type:
  573.      
  574.      A> make
  575.      
  576.      MAKE first reads `make.ini' then `makefile'.  It sees the first target
  577.      `test.exe' and tries to make it.  But first, MAKE must know if the
  578.      files that `test.exe' depends on are up to date.  As `test.exe'
  579.      depends on several `.obj' files, and these `.obj' files also have
  580.      dependents, the (very) detailed procedure that MAKE undergoes looks
  581.      like this:
  582.      
  583.      -Make `test.exe'
  584.       `test.exe' depends on `main.obj' and `sub.obj'.  Make each of these
  585.           -Make `main.obj'
  586.            `main.obj' depends on `incl.h'.
  587.                -Make `incl.h'
  588.                     `incl.h' depends on nothing explicitly.
  589.  
  590.  
  591.  
  592.  
  593.  
  594.  
  595.                                                    NDMAKE v3.0 page 10
  596.  
  597.  
  598.  
  599.  
  600.  
  601.                     -Since there are no explicit commands to make `incl.h',
  602.                      check for implicit dependencies.
  603.                     -Since there is no `.h' suffix in .SUFFIXES, there are
  604.                      no implicit dependencies.
  605.                -Assume `incl.h' is up to date.
  606.           -Since there are no explicit commands for `main.obj', check for
  607.            implicit dependencies based on default rules.
  608.           -Find the rule `.c.obj' and the file `main.c'.
  609.                -Make `main.c'
  610.                     `main.c' depends on nothing explicitly.
  611.                     -Since there are no explicit commands to make `main.c',
  612.                      check for implicit dependencies.
  613.                     -Since there are no `.from_extension.c' rules, `main.c'
  614.                      depends on nothing implicitly.
  615.                -Assume `main.c' is up to date.
  616.           -Compare `main.obj' with `incl.h' and `main.c'.  Since `main.obj'
  617.            doesn't exist, it is out of date with respect to its dependents,
  618.            so execute the (implicit) command:
  619.      
  620.                cl -AL -c main.c
  621.      
  622.           -Assume `main.obj' is up to date.
  623.           -Make `sub.obj'
  624.            `sub.obj' depends on `incl.h' and `sub.c'
  625.                -Make `incl.h'
  626.                 MAKE already knows that `incl.h' is up to date.
  627.                -Make `sub.c'
  628.                     `sub.c' depends on nothing explicitly
  629.                     -Since there are no explicit commands to make `sub.c',
  630.                      check for implicit dependencies.
  631.                     -Since there are no `.from_extension.c' rules, `sub.c'
  632.                      depends on nothing implicitly.
  633.                -Assume `sub.c' is up to date.
  634.           -Compare `sub.obj' with `incl.h' and `sub.c'.  Since `sub.obj'
  635.            doesn't exist, it is out of date with respect to its dependents,
  636.            so execute the (explicit) command:
  637.      
  638.                cl -AL -Od -c sub.c
  639.      
  640.           -Assume `sub.obj' is up to date.
  641.      -Compare `test.exe' with `main.obj' and `sub.obj'.  Since `test.exe'
  642.       doesn't exist, execute the command:
  643.      
  644.           link main.obj sub.obj, test.exe;
  645.      
  646.      -Assume `test.exe' is up to date.
  647.      
  648.      Note the way $< gets replaced with the files `test.exe' depends on,
  649.      and $@ gets replaced with `test.exe'.
  650.      
  651.      Assuming no errors occurred, when you now type `make' you will get the
  652.      message that `test.exe' is up to date.  If you edit `sub.c' and make
  653.      some changes, when you next type `make', MAKE will see that `sub.c' is
  654.  
  655.  
  656.  
  657.  
  658.  
  659.  
  660.  
  661.                                                    NDMAKE v3.0 page 11
  662.  
  663.  
  664.  
  665.  
  666.  
  667.      more recent than `sub.obj' and recompile `sub.c'.  MAKE will then see
  668.      that `sub.obj' is more recent than `test.exe' and relink the files.
  669.      
  670.      If you type `make install', MAKE will ensure `test.exe' is up to date,
  671.      then copy it to your BIN directory.  BIN was assumed to be defined in
  672.      your environment.
  673.      
  674.  
  675.      Using MAKE without a makefile
  676.      -----------------------------
  677.  
  678.      It is possible to use MAKE without having a makefile.  Assume you have
  679.      a file called `xyzzy.c' and using the same `make.ini' file described
  680.      above, you type:
  681.      
  682.      A> make xyzzy.exe
  683.      
  684.      MAKE uses its default rules to compile `xyzzy.c', link `xyzzy.obj' to
  685.      form `xyzzy.exe', then erases `xyzzy.obj'.  If several `.exe' files
  686.      exist in a directory and you have just finished editing some of their
  687.      `.c' files, you could type:
  688.      
  689.      A> make *.exe
  690.      
  691.      and update only the `.exe' files that are out of date.  By adding more
  692.      default rules to `make.ini', MAKE could invoke the FORTRAN compiler
  693.      for `.for' files or MASM for `.asm' files.  In this way, MAKE can do
  694.      the right thing for each type of file.  You can do `make *.exe' and
  695.      have MAKE figure out what to do.
  696.  
  697.  
  698.  
  699.  
  700.  
  701.  
  702.  
  703.  
  704.  
  705.  
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.                                                    NDMAKE v3.0 page 12
  728.  
  729.  
  730.  
  731.  
  732.  
  733.      USER-SUPPORTED SOFTWARE NOTIFICATION
  734.      ------------------------------------
  735.  
  736.      If you like and use this program, I ask you to consider registering
  737.      it.  The benefits of registration include the first bugfix/enhanced
  738.      version free.  Registered owners will get a response to any questions
  739.      they may have.  I anticipate adding VPATH (a way to look for dependent
  740.      files in other than the current directory) and ARC and LIB support for
  741.      the next version.  Also, I am certain there will be some reported bugs
  742.      or incompatibilities with UN*X MAKE which will be fixed in the first
  743.      update.
  744.      
  745.      The suggested registration fee is $20.  Regardless of whether you
  746.      register or not, you may freely copy and distribute this program for
  747.      noncommercial purposes.  The program, MAKE.EXE, the documentation,
  748.      MAKE.DOC, and the initialization file, MAKE.INI must all be
  749.      distributed together.
  750.      
  751.      Commercial use of this program requires my prior written consent.
  752.      
  753.      I hope you enjoy NDMAKE and find it to be a useful addition to your
  754.      programming tools.
  755.  
  756.  
  757.  
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.  
  790.  
  791.  
  792.  
  793.                                                    NDMAKE v3.0 page 13
  794.  
  795.  
  796.  
  797.  
  798.  
  799.      ---------------------------------------------------------------------
  800.                        Registration form for NDMAKE v3.0
  801.      
  802.      
  803.      
  804.      Name:               _________________________________________________
  805.      
  806.      Address:            _________________________________________________
  807.      
  808.      City, State, Zip:   _________________________________________________
  809.      
  810.      Country:            _________________________________________________
  811.      
  812.      
  813.      OPTIONAL: System description (computer, memory, DOS version)
  814.      
  815.      _____________________________________________________________________
  816.      
  817.      _____________________________________________________________________
  818.      
  819.      
  820.      COMMENTS: Please feel free to add your thoughts or suggestions!
  821.      
  822.      _____________________________________________________________________
  823.      
  824.      _____________________________________________________________________
  825.      
  826.      _____________________________________________________________________
  827.      
  828.      _____________________________________________________________________
  829.      
  830.      
  831.      Mail to:
  832.                D. G. Kneller
  833.                2 Panoramic Way #204
  834.                Berkeley CA, 94704
  835.                U.S.A
  836.  
  837.  
  838.  
  839.  
  840.  
  841.  
  842.  
  843.  
  844.  
  845.  
  846.  
  847.  
  848.  
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.